home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / nihcl-30.lha / nihcl-3.0 / lib / OIOTbl.c < prev    next >
C/C++ Source or Header  |  1990-05-19  |  3KB  |  119 lines

  1. /* OIOTbl.c -- Implementation of tables used for Object I/O
  2.  
  3.     THIS SOFTWARE FITS THE DESCRIPTION IN THE U.S. COPYRIGHT ACT OF A
  4.     "UNITED STATES GOVERNMENT WORK".  IT WAS WRITTEN AS A PART OF THE
  5.     AUTHOR'S OFFICIAL DUTIES AS A GOVERNMENT EMPLOYEE.  THIS MEANS IT
  6.     CANNOT BE COPYRIGHTED.  THIS SOFTWARE IS FREELY AVAILABLE TO THE
  7.     PUBLIC FOR USE WITHOUT A COPYRIGHT NOTICE, AND THERE ARE NO
  8.     RESTRICTIONS ON ITS USE, NOW OR SUBSEQUENTLY.
  9.  
  10. Author:
  11.     K. E. Gorlen
  12.     Bg. 12A, Rm. 2033
  13.     Computer Systems Laboratory
  14.     Division of Computer Research and Technology
  15.     National Institutes of Health
  16.     Bethesda, Maryland 20892
  17.     Phone: (301) 496-1111
  18.     uucp: uunet!nih-csl!kgorlen
  19.     Internet:kgorlen@alw.nih.gov
  20.     July, 1988
  21.  
  22. Function:
  23.     
  24. Tables to keep track of multiple references to objects and classes.
  25. Used by storeOn()/readFrom().
  26.  
  27. Modification History:
  28.  
  29. $Log:    OIOTbl.c,v $
  30.  * Revision 3.0  90/05/20  00:20:24  kgorlen
  31.  * Release for 1st edition.
  32.  * 
  33. */
  34.  
  35. #include "OIOTbl.h"
  36. #include "AssocInt.h"
  37.  
  38. extern const int NIHCL_STMBRREF,NIHCL_STREFMBR;
  39.  
  40. StoreOnTbl::StoreOnTbl(unsigned size)
  41.     : d(size), c(Class::dictionary.size())
  42. {
  43.     d.add(*new AssocInt(*Object::nil,0));    // add nil object
  44.     objNum = classNum = 0;
  45. }
  46.  
  47. StoreOnTbl::~StoreOnTbl()
  48. {
  49.     DO(d,AssocInt,asc) delete asc; OD
  50.     DO(c,Class,cl) cl->number(0); OD
  51. }
  52.  
  53. bool StoreOnTbl::add(const Object& obj, int& num)
  54. {
  55.     AssocInt* asc = (AssocInt*)d.assocAt(obj);
  56.     if (asc == 0) {    // object has not been stored
  57.         d.add(*new AssocInt((Object&)obj, (num = ++objNum)));
  58.         return YES;    // need to store object
  59.     }
  60. // return number of stored object
  61.     num = (int)Integer::castdown(asc->value())->value(); 
  62.     if (num == -1) setError(NIHCL_STREFMBR,DEFAULT,&obj,obj.className());
  63.     return NO;        // don't need to store object -- use reference
  64. }
  65.  
  66. bool StoreOnTbl::addClass(const Class* cp, unsigned short& num)
  67. {
  68.     if ((num = cp->number()) == 0) { 
  69.         c.add(*(Class*)cp);
  70.         ((Class*)cp)->number(num = ++classNum);
  71.         return YES;    // need to store class
  72.     }
  73.     return NO;    // don't need to store class -- use reference
  74. }
  75.  
  76. void StoreOnTbl::addMember(const Object& obj)
  77. {
  78.     AssocInt* asc = (AssocInt*)d.assocAt(obj);
  79.     if (asc == 0) {            // object has not been stored 
  80.         d.add(*new AssocInt((Object&)obj,-1));    // add member object to IdentDict
  81.         return;
  82.     }
  83. // Error -- tried to store a member object that has already been stored
  84.        int objectNum = (int)Integer::castdown(asc->value())->value(); 
  85.     setError(NIHCL_STMBRREF,DEFAULT,objectNum,&obj,obj.className());
  86. }
  87.  
  88. ReadFromTbl::ReadFromTbl(unsigned size)
  89.     : obs(size), cls(Class::dictionary.size())
  90. {
  91.     obs.add(*Object::nil);        // nil is @0
  92.     cls.add(*Object::nil);
  93. }
  94.  
  95. int ReadFromTbl::add(Object& obj)
  96. {
  97.     int objectNum = obs.size();
  98.     if (objectNum == obs.capacity()) obs.reSize(objectNum+1024);
  99.     obs.add(obj);
  100.     return objectNum;
  101. }
  102.  
  103. int ReadFromTbl::add(const Class* cl)
  104. {
  105.     int classNum = cls.size();
  106.     cls.add(*(Class*)cl);
  107.     return classNum;
  108. }
  109.  
  110. Object* ReadFromTbl::objectAt(int i)
  111. {
  112.     return obs[i];
  113. }
  114.  
  115. const Class* ReadFromTbl::classAt(int i)
  116. {
  117.     return Class::castdown(cls[i]);
  118. }
  119.